package carros;

import java.util.Random;

import principal.Janela;
import principal.Monitor;
import principal.Simulacao;

public class Carro extends Thread{
	private int faixa;
	private int velocidade;
	private int posicao;
	private int humor;


	public Carro() {
		faixa = 0;
		velocidade = 0;
		posicao = 0;
		humor = 0;
	}

	public void run(){
		while(!Simulacao.getInstance().fimDaSimulacao()){
			aguardaTempoAleatorio(3000);
			escolheFaixa();
			escolheVelocidadeInicial();			
			efetuaPercurso();
		}
	}

	private synchronized void efetuaPercurso() {
		int mudouDeFaixa;
		escolheHumorAleatorio();
		setPosicao(0);
		Janela.getInstance("Carros").desenhaCarro(this, 0, 0);
		while(getPosicao() <= 999) {
			mudouDeFaixa = mudaDeFaixa();			
			int quantoAnda = Monitor.getInstance().quantoAnda(this);
			
			setPosicao(getPosicao() + quantoAnda);
			
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			
			
			Janela.getInstance("Carros").desenhaCarro(this, mudouDeFaixa, quantoAnda);
		}
		Monitor.getInstance().saiDaFila(this);

	}

	private int mudaDeFaixa() {
		int muda = geraNumeroAleatorio(1000);
		int r;
		if(muda < 950) return 0;
		int direcao = geraNumeroAleatorio(1);
		if(direcao == 1) {
			r = Monitor.getInstance().mudaDeFaixa(this, "esquerda");
			if( r != 0) return 1;
			
		}
		else {
			r = Monitor.getInstance().mudaDeFaixa(this, "direita");
			if( r != 0) return -1;
		}
		
		return 0;
		
	}

	private void escolheHumorAleatorio() {
		int humor;
		humor = ((int) (geraNumeroAleatorio(3)) + 1);
		setHumor(humor);
		
	}

	private void escolheVelocidadeInicial() {
		int velocidade;
		velocidade = ((int) (geraNumeroAleatorio(5)) + 1);
		setVelocidade(velocidade);
	}

	private void escolheFaixa() {
		int faixa;
		faixa = (int)(geraNumeroAleatorio(Simulacao.getInstance().getNumeroDeFaixas()-1));
		setFaixa(faixa);
		Monitor.getInstance().entraNaFila(this);
	}

	private void aguardaTempoAleatorio(long intervalo) {
		int tempo;
		tempo = geraNumeroAleatorio((int)intervalo);

		try {
			Thread.sleep((long)tempo);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	private int geraNumeroAleatorio(int intervalo) {
		int numero;

		Random factor = new Random();
		numero = (int)(factor.nextDouble()*(intervalo + 1));
		return numero;
	}

	public int getFaixa() {
		return faixa;
	}

	public void setFaixa(int faixa) {
		this.faixa = faixa;
	}

	public int getVelocidade() {
		return velocidade;
	}

	public void setVelocidade(int velocidade) {
/*		if(velocidade < 2)
			this.velocidade = 2;
		else
			if(velocidade > 6)
				this.velocidade = 6;
			else
	*/			this.velocidade = velocidade;
	}

	public int getPosicao() {
		return posicao;
	}

	public void setPosicao(int posicao) {
		this.posicao = posicao;
	}
	
	public int getHumor() {
		return humor;
	}

	public void setHumor(int humor) {
		this.humor = humor;
	}

}
